﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SISLOG.BusinessEntities;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using System.Data.Common;
using Microsoft.Practices.Unity;

namespace SISLOG.DataAccess
{
    public class OrdenPedidoDAO: MasterDAEL, IOrdenPedidoDAO
    {
        [Dependency]
        public IDetalleOrdenPedidoDAO DetalleOrdenPedidoDAO { get; set; }

        public List<OrdenPedido> GetAllFromOrdenPedido()
        {
            var query = dbSisLog.ExecuteSprocAccessor<OrdenPedido>("GetAllFromOrdenPedido", RowMapperFactory());
            return query.ToList();
        }

        public IRowMapper<OrdenPedido> RowMapperFactory()
        {
            IRowMapper<OrdenPedido> rowMapper = MapBuilder<OrdenPedido>
                                                .MapAllProperties()
                                                .Map(p => p.DetalleOrdenPedido)
                                                .WithFunc(p => DetalleOrdenPedidoDAO.GetFromDetalleOrdenPedidoByOrdenId(p.GetInt32(p.GetOrdinal("idOrdenPedido"))))
                                                .Build();
            return rowMapper;
        }

        public OrdenPedido GetFromOrdenPedidoById(int idOrdenPedido)
        {
            var query = dbSisLog.ExecuteSprocAccessor<OrdenPedido>("GetFromOrdenPedidoById", RowMapperFactory(), idOrdenPedido);
            return query.SingleOrDefault();
        }

        public void RealizarOrdenPedido(OrdenPedido ordenpedido)
        {
            DbCommand command = dbSisLog.GetStoredProcCommand("RealizarOrdenPedido");

            DbParameter param = command.CreateParameter();

            param.Direction = System.Data.ParameterDirection.InputOutput;
            param.ParameterName = "id";
            param.DbType = System.Data.DbType.Int32;
            param.Value = ordenpedido.idOrdenPedido;

            command.Parameters.Add(param);

            dbSisLog.AddInParameter(command, "idOrdenPedido", System.Data.DbType.Int32, ordenpedido.idOrdenPedido);
            dbSisLog.AddInParameter(command, "fechaSolicitud", System.Data.DbType.DateTime, ordenpedido.fechaSolicitud);
            dbSisLog.AddInParameter(command, "area", System.Data.DbType.String, ordenpedido.area);
            dbSisLog.AddInParameter(command, "supervisor", System.Data.DbType.String, ordenpedido.supervisor);
            dbSisLog.AddInParameter(command, "fechaEntrega", System.Data.DbType.DateTime, ordenpedido.fechaEntrega);

            dbSisLog.ExecuteNonQuery(command);

            ordenpedido.idOrdenPedido = Int32.Parse(param.Value.ToString());

            DetalleOrdenPedidoDAO.RegistrarDetalleOrdenPedido(ordenpedido.DetalleOrdenPedido, ordenpedido.idOrdenPedido);
        }
    }
}

